package com.ftg.learn.firstboot.dept.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ftg.learn.firstboot.dept.entity.Dept;
import com.ftg.learn.firstboot.dept.mapper.DeptMapper;
import com.ftg.learn.firstboot.util.ResultType;
import org.apache.ibatis.annotations.One;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * @author KangJx
 * @date 2020/12/4
 */
@Service
public class DeptService{

    @Autowired
    DeptMapper deptMapper;

    /**
     * 查看表里面全部信息
     * @return
     */
    public List<Dept> showall(){
        return deptMapper.selectList(null);
    }

    /**
     * 带分页功能的
     * @return
     */
    public ResultType<Dept> showpage(int page,int limit) {
        ResultType t = new ResultType();
        t.setCode(0);

        IPage<Dept> ip = new Page<>(page,limit);
        ip = deptMapper.selectPage(ip,null);

        t.setData(ip.getRecords());
        t.setTotal(ip.getTotal());
        return t;
    }

    /**
     * 表示按给定信息完成分页显示功能
     * @param page    页码
     * @param limit   条目数
     * @return
     */
    public IPage<Dept> showAllWithIpage(int page,int limit){

        IPage<Dept> iPage = new Page<>();
        iPage.setCurrent(page);
        iPage.setSize(limit);
        QueryWrapper t = new QueryWrapper();
        //select 查询语句 当中的显示字段使用
        t.select("deptno,dname,loc").eq("deptno",10);
        return deptMapper.selectPage(iPage,t);
    }

    /**
     * 添加功能，如何存在大量sql操作，要添加事务
     * 这里直接采用声明式事务完成
     * @Transactional(里面要声明事务处理时的异常)
     * @param d  部门实体
     * @return  影响行数
     */
    @Transactional(rollbackFor = Exception.class)
    public int saveDept(Dept d){
        return deptMapper.insert(d);
    }

    /**
     * 完成修改操作,按主键完成修改操作
     * @param d 部门实体
     * @return 影响行数
     */
    public int updateDept(Dept d){
        return deptMapper.updateById(d);
    }

    /**
     * 修改操作，修改操作，带一些复杂的where操作
     * @param d       部门实体类
     * @param deptno  主键，用来where 的条件
     * @return  影响行数
     */
    public int modifyWithId(Dept d,String deptno){
        UpdateWrapper<Dept> uw = new UpdateWrapper<>();
        uw.gt("deptno",deptno);
        //where条件复杂
        return deptMapper.update(d,uw);
    }


    /**
     * 完成部门的修改操作
     * @param deptno  主键
     * @return  影响行数
     */
    public int delDept(String deptno){
        return deptMapper.deleteById(deptno);
    }

    /**
     * 用做批量删除操作
     * @param ids 大量的待删除主键  list的泛型与主键类型一致
     * @return 删除量
     */
    public int delIds(List<Integer> ids){
        return deptMapper.deleteBatchIds(ids);
    }

    /**
     * 按主键查一
     * @param deptno  主键
     * @return   Dept
     */
    public Dept getOne(String deptno){
        return deptMapper.selectById(deptno);
    }

    /**
     * 按多条件进行查一操作
     * @param dname
     * @param loc
     * @return
     */
    public Dept getOneWithWrapper(String dname,String loc){
        QueryWrapper<Dept> qw = new QueryWrapper<>();
        qw.eq("dname",dname);
        qw.eq("loc",loc);
        return deptMapper.selectOne(qw);
    }
}
